{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# XGBoost Parameter Tuning for Happy Customer Bank"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 6.调整树的参数：调整正则化参数：reg_alpha 和reg_lambda"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "数据说明:\n",
    "数据集共26个字段: 其中1-24列为输入特征，25-26列为输出特征。\n",
    "    1. ID - 唯一ID（不能用于预测）\n",
    "    2. Gender - 性别\n",
    "    3. City - 城市\n",
    "    4. Monthly_Income - 月收入（以卢比为单位）\n",
    "    5. DOB - 出生日期\n",
    "    6. Lead_Creation_Date - 潜在（贷款）创建日期\n",
    "    7. Loan_Amount_Applied - 贷款申请请求金额（印度卢比，INR）\n",
    "    8. Loan_Tenure_Applied - 贷款申请期限（单位为年）\n",
    "    9. Existing_EMI -现有贷款的EMI（EMI：电子货币机构许可证） \n",
    "    10. Employer_Name雇主名称\n",
    "    11. Salary_Account - 薪资帐户银行\n",
    "    12. Mobile_Verified - 是否移动验证（Y / N）\n",
    "    13. VAR5 - 连续型变量\n",
    "    14. VAR1-  类别型变量\n",
    "    15. Loan_Amount_Submitted - 提交的贷款金额（在看到资格后修改和选择）\n",
    "    16. Loan_Tenure_Submitted - 提交的贷款期限（单位为年，在看到资格后修改和选择）\n",
    "    17. Interest_Rate - 提交贷款金额的利率\n",
    "    18. Processing_Fee - 提交贷款的处理费（INR）\n",
    "    19. EMI_Loan_Submitted -提交的EMI贷款金额（INR）\n",
    "    20. Filled_Form - 后期报价后是否已填写申请表格\n",
    "    21. Device_Type - 进行申请的设备（浏览器/移动设备）\n",
    "    22. Var2 - 类别型变量\n",
    "    23. Source - 类别型变量\n",
    "    24. Var4 - 类别型变量\n",
    "\n",
    "输出：\n",
    "    25. LoggedIn - 是否login（只用于理解问题的变量，不能用于预测，测试集中没有）\n",
    "    26. Disbursed - 是否发放贷款（目标变量），1为发放贷款（目标客户）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from xgboost import XGBClassifier\n",
    "import xgboost as xgb\n",
    "\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "\n",
    "from sklearn.metrics import log_loss\n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "train = pd.read_csv('train_save.csv')\n",
    "test = pd.read_csv('test_save.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((87020, 52), (37717, 51))"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train.shape, test.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.countplot(train.Disbursed);\n",
    "pyplot.xlabel('Disbursed');\n",
    "pyplot.ylabel('Number of occurrences');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "样本不均衡，使用交叉验证"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# prepare cross validation\n",
    "kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "默认参数，此时学习率为0.1，比较大，观察弱分类数目的大致范围\n",
    "（采用默认参数配置，看看模型是过拟合还是欠拟合）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_train = train['Disbursed']\n",
    "train = train.drop([\"Disbursed\"], axis=1)\n",
    "X_train = np.array(train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 87020 entries, 0 to 87019\n",
      "Data columns (total 51 columns):\n",
      "Existing_EMI                     87020 non-null float64\n",
      "Loan_Amount_Applied              87020 non-null float64\n",
      "Loan_Tenure_Applied              87020 non-null float64\n",
      "Monthly_Income                   87020 non-null int64\n",
      "Var4                             87020 non-null int64\n",
      "Var5                             87020 non-null int64\n",
      "Age                              87020 non-null int64\n",
      "EMI_Loan_Submitted_Missing       87020 non-null int64\n",
      "Interest_Rate_Missing            87020 non-null int64\n",
      "Loan_Amount_Submitted_Missing    87020 non-null int64\n",
      "Loan_Tenure_Submitted_Missing    87020 non-null int64\n",
      "Processing_Fee_Missing           87020 non-null int64\n",
      "Device_Type_0                    87020 non-null int64\n",
      "Device_Type_1                    87020 non-null int64\n",
      "Filled_Form_0                    87020 non-null int64\n",
      "Filled_Form_1                    87020 non-null int64\n",
      "Gender_0                         87020 non-null int64\n",
      "Gender_1                         87020 non-null int64\n",
      "Var1_0                           87020 non-null int64\n",
      "Var1_1                           87020 non-null int64\n",
      "Var1_2                           87020 non-null int64\n",
      "Var1_3                           87020 non-null int64\n",
      "Var1_4                           87020 non-null int64\n",
      "Var1_5                           87020 non-null int64\n",
      "Var1_6                           87020 non-null int64\n",
      "Var1_7                           87020 non-null int64\n",
      "Var1_8                           87020 non-null int64\n",
      "Var1_9                           87020 non-null int64\n",
      "Var1_10                          87020 non-null int64\n",
      "Var1_11                          87020 non-null int64\n",
      "Var1_12                          87020 non-null int64\n",
      "Var1_13                          87020 non-null int64\n",
      "Var1_14                          87020 non-null int64\n",
      "Var1_15                          87020 non-null int64\n",
      "Var1_16                          87020 non-null int64\n",
      "Var1_17                          87020 non-null int64\n",
      "Var1_18                          87020 non-null int64\n",
      "Var2_0                           87020 non-null int64\n",
      "Var2_1                           87020 non-null int64\n",
      "Var2_2                           87020 non-null int64\n",
      "Var2_3                           87020 non-null int64\n",
      "Var2_4                           87020 non-null int64\n",
      "Var2_5                           87020 non-null int64\n",
      "Var2_6                           87020 non-null int64\n",
      "Mobile_Verified_0                87020 non-null int64\n",
      "Mobile_Verified_1                87020 non-null int64\n",
      "Source_0                         87020 non-null int64\n",
      "Source_1                         87020 non-null int64\n",
      "Source_2                         87020 non-null int64\n",
      "Source_3                         87020 non-null int64\n",
      "Source_4                         87020 non-null int64\n",
      "dtypes: float64(3), int64(48)\n",
      "memory usage: 33.9 MB\n"
     ]
    }
   ],
   "source": [
    "train.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "第二轮参数调整得到的n_estimators最优值（86），其余参数继续默认值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'reg_alpha': [0.01, 0.1, 1, 1.5], 'reg_lambda': [0.1, 0.5, 1, 2]}"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "reg_alpha = [ 0.01,0.1,1,1.5]    #default = 0, 测试0.1,1，1.5，2\n",
    "reg_lambda = [0.1,0.5, 1,2]      #default = 1，测试0.1， 0.5， 1，2\n",
    "\n",
    "param_test5_1 = dict(reg_alpha=reg_alpha, reg_lambda=reg_lambda)\n",
    "param_test5_1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/ice2018/anaconda2/lib/python2.7/site-packages/sklearn/model_selection/_search.py:762: DeprecationWarning: The grid_scores_ attribute was deprecated in version 0.18 in favor of the more elaborate cv_results_ attribute. The grid_scores_ attribute will not be available from 0.20\n",
      "  DeprecationWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "([mean: -0.06366, std: 0.00108, params: {'reg_alpha': 0.01, 'reg_lambda': 0.1},\n",
       "  mean: -0.06366, std: 0.00103, params: {'reg_alpha': 0.01, 'reg_lambda': 0.5},\n",
       "  mean: -0.06364, std: 0.00121, params: {'reg_alpha': 0.01, 'reg_lambda': 1},\n",
       "  mean: -0.06372, std: 0.00100, params: {'reg_alpha': 0.01, 'reg_lambda': 2},\n",
       "  mean: -0.06378, std: 0.00116, params: {'reg_alpha': 0.1, 'reg_lambda': 0.1},\n",
       "  mean: -0.06362, std: 0.00107, params: {'reg_alpha': 0.1, 'reg_lambda': 0.5},\n",
       "  mean: -0.06371, std: 0.00106, params: {'reg_alpha': 0.1, 'reg_lambda': 1},\n",
       "  mean: -0.06373, std: 0.00104, params: {'reg_alpha': 0.1, 'reg_lambda': 2},\n",
       "  mean: -0.06365, std: 0.00108, params: {'reg_alpha': 1, 'reg_lambda': 0.1},\n",
       "  mean: -0.06363, std: 0.00102, params: {'reg_alpha': 1, 'reg_lambda': 0.5},\n",
       "  mean: -0.06381, std: 0.00109, params: {'reg_alpha': 1, 'reg_lambda': 1},\n",
       "  mean: -0.06386, std: 0.00104, params: {'reg_alpha': 1, 'reg_lambda': 2},\n",
       "  mean: -0.06376, std: 0.00101, params: {'reg_alpha': 1.5, 'reg_lambda': 0.1},\n",
       "  mean: -0.06382, std: 0.00109, params: {'reg_alpha': 1.5, 'reg_lambda': 0.5},\n",
       "  mean: -0.06387, std: 0.00110, params: {'reg_alpha': 1.5, 'reg_lambda': 1},\n",
       "  mean: -0.06385, std: 0.00113, params: {'reg_alpha': 1.5, 'reg_lambda': 2}],\n",
       " {'reg_alpha': 0.1, 'reg_lambda': 0.5},\n",
       " -0.0636229771557636)"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xgb5_1 = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=86,  #第二轮参数调整得到的n_estimators最优值\n",
    "        max_depth=5,\n",
    "        min_child_weight=2,\n",
    "        gamma=0,\n",
    "        subsample=0.8,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel = 0.7,\n",
    "        objective= 'binary:logistic',\n",
    "        seed=3)\n",
    "\n",
    "\n",
    "gsearch5_1 = GridSearchCV(xgb5_1, param_grid = param_test5_1, scoring='neg_log_loss',n_jobs=-1, cv=kfold)\n",
    "gsearch5_1.fit(X_train , y_train)\n",
    "\n",
    "gsearch5_1.grid_scores_, gsearch5_1.best_params_,     gsearch5_1.best_score_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/ice2018/anaconda2/lib/python2.7/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/home/ice2018/anaconda2/lib/python2.7/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split0_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/home/ice2018/anaconda2/lib/python2.7/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split1_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/home/ice2018/anaconda2/lib/python2.7/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split2_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/home/ice2018/anaconda2/lib/python2.7/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split3_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/home/ice2018/anaconda2/lib/python2.7/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split4_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/home/ice2018/anaconda2/lib/python2.7/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'mean_fit_time': array([ 9.91125875, 10.26974778, 10.4027462 , 10.34169946, 10.37877078,\n",
       "        10.3669488 , 10.51771259, 10.07991138,  9.8428772 , 10.19984088,\n",
       "         9.96351223,  9.96772194, 10.15126581,  9.90682778,  9.86163101,\n",
       "         9.4272748 ]),\n",
       " 'mean_score_time': array([0.07993121, 0.07604222, 0.07339125, 0.07091918, 0.07680159,\n",
       "        0.07742057, 0.06967683, 0.0684864 , 0.06481543, 0.07078819,\n",
       "        0.06300201, 0.07449141, 0.07035904, 0.06028142, 0.05068517,\n",
       "        0.04612303]),\n",
       " 'mean_test_score': array([-0.06366273, -0.06365609, -0.06363997, -0.06372421, -0.0637768 ,\n",
       "        -0.06362298, -0.06371308, -0.06372593, -0.0636503 , -0.06362558,\n",
       "        -0.0638134 , -0.06386335, -0.06375559, -0.06382111, -0.06386689,\n",
       "        -0.06385184]),\n",
       " 'mean_train_score': array([-0.05884751, -0.05902809, -0.05919464, -0.05954116, -0.05890077,\n",
       "        -0.05901627, -0.05927172, -0.05952775, -0.05951856, -0.05957222,\n",
       "        -0.05985713, -0.06010157, -0.05983498, -0.05996858, -0.0600894 ,\n",
       "        -0.06021761]),\n",
       " 'param_reg_alpha': masked_array(data=[0.01, 0.01, 0.01, 0.01, 0.1, 0.1, 0.1, 0.1, 1, 1, 1, 1,\n",
       "                    1.5, 1.5, 1.5, 1.5],\n",
       "              mask=[False, False, False, False, False, False, False, False,\n",
       "                    False, False, False, False, False, False, False, False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'param_reg_lambda': masked_array(data=[0.1, 0.5, 1, 2, 0.1, 0.5, 1, 2, 0.1, 0.5, 1, 2, 0.1,\n",
       "                    0.5, 1, 2],\n",
       "              mask=[False, False, False, False, False, False, False, False,\n",
       "                    False, False, False, False, False, False, False, False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'params': [{'reg_alpha': 0.01, 'reg_lambda': 0.1},\n",
       "  {'reg_alpha': 0.01, 'reg_lambda': 0.5},\n",
       "  {'reg_alpha': 0.01, 'reg_lambda': 1},\n",
       "  {'reg_alpha': 0.01, 'reg_lambda': 2},\n",
       "  {'reg_alpha': 0.1, 'reg_lambda': 0.1},\n",
       "  {'reg_alpha': 0.1, 'reg_lambda': 0.5},\n",
       "  {'reg_alpha': 0.1, 'reg_lambda': 1},\n",
       "  {'reg_alpha': 0.1, 'reg_lambda': 2},\n",
       "  {'reg_alpha': 1, 'reg_lambda': 0.1},\n",
       "  {'reg_alpha': 1, 'reg_lambda': 0.5},\n",
       "  {'reg_alpha': 1, 'reg_lambda': 1},\n",
       "  {'reg_alpha': 1, 'reg_lambda': 2},\n",
       "  {'reg_alpha': 1.5, 'reg_lambda': 0.1},\n",
       "  {'reg_alpha': 1.5, 'reg_lambda': 0.5},\n",
       "  {'reg_alpha': 1.5, 'reg_lambda': 1},\n",
       "  {'reg_alpha': 1.5, 'reg_lambda': 2}],\n",
       " 'rank_test_score': array([ 6,  5,  3,  8, 11,  1,  7,  9,  4,  2, 12, 15, 10, 13, 16, 14],\n",
       "       dtype=int32),\n",
       " 'split0_test_score': array([-0.06332227, -0.06314624, -0.06300362, -0.0633813 , -0.06335535,\n",
       "        -0.06321193, -0.06284786, -0.06347119, -0.06296712, -0.06298297,\n",
       "        -0.06307641, -0.06314731, -0.06295845, -0.06299213, -0.06306654,\n",
       "        -0.06314837]),\n",
       " 'split0_train_score': array([-0.05922825, -0.05935036, -0.05942555, -0.05982912, -0.05919657,\n",
       "        -0.05924163, -0.05956111, -0.05994625, -0.05975204, -0.05966724,\n",
       "        -0.05976919, -0.06041571, -0.05993856, -0.05987716, -0.06018795,\n",
       "        -0.06035873]),\n",
       " 'split1_test_score': array([-0.06500633, -0.06494748, -0.06497047, -0.06503252, -0.065157  ,\n",
       "        -0.06499318, -0.06496235, -0.06506457, -0.06497556, -0.06500674,\n",
       "        -0.06513001, -0.06519981, -0.06507962, -0.06516112, -0.06534414,\n",
       "        -0.06540689]),\n",
       " 'split1_train_score': array([-0.05831484, -0.05845856, -0.05876225, -0.05884783, -0.05827671,\n",
       "        -0.05860772, -0.05890696, -0.05909044, -0.05904947, -0.05910631,\n",
       "        -0.05961047, -0.0596875 , -0.05954274, -0.05961937, -0.05972141,\n",
       "        -0.05992825]),\n",
       " 'split2_test_score': array([-0.06487599, -0.06486164, -0.06522237, -0.06477884, -0.0651615 ,\n",
       "        -0.06479725, -0.06504905, -0.06481113, -0.06494715, -0.06471753,\n",
       "        -0.06515237, -0.06505238, -0.06488002, -0.06515571, -0.06506336,\n",
       "        -0.06504261]),\n",
       " 'split2_train_score': array([-0.05852567, -0.05884482, -0.05898584, -0.05929506, -0.05882749,\n",
       "        -0.05873181, -0.05909544, -0.05931974, -0.05916624, -0.05912874,\n",
       "        -0.05956546, -0.05969925, -0.05957158, -0.05971527, -0.05984389,\n",
       "        -0.05996232]),\n",
       " 'split3_test_score': array([-0.06251895, -0.06265084, -0.06252011, -0.06280969, -0.0626211 ,\n",
       "        -0.0626079 , -0.06284155, -0.06264235, -0.06269991, -0.06284175,\n",
       "        -0.06304111, -0.06310126, -0.06309307, -0.06295263, -0.06303119,\n",
       "        -0.0629319 ]),\n",
       " 'split3_train_score': array([-0.05903007, -0.05916245, -0.05921931, -0.05977691, -0.05899741,\n",
       "        -0.05909795, -0.05943994, -0.05933791, -0.05982061, -0.05990266,\n",
       "        -0.06008412, -0.06038942, -0.06016961, -0.06043643, -0.06030974,\n",
       "        -0.06039826]),\n",
       " 'split4_test_score': array([-0.06258995, -0.06267411, -0.0624831 , -0.06261853, -0.06258885,\n",
       "        -0.06250444, -0.06286449, -0.06264023, -0.0626616 , -0.0625788 ,\n",
       "        -0.06266695, -0.06281586, -0.06276665, -0.06284384, -0.06282905,\n",
       "        -0.06272926]),\n",
       " 'split4_train_score': array([-0.05913874, -0.05932428, -0.05958027, -0.05995689, -0.05920568,\n",
       "        -0.05940223, -0.05935512, -0.0599444 , -0.05980443, -0.06005613,\n",
       "        -0.06025642, -0.06031599, -0.05995239, -0.06019466, -0.06038402,\n",
       "        -0.06044053]),\n",
       " 'std_fit_time': array([0.22517239, 0.25760232, 0.27329922, 0.20969363, 0.25188895,\n",
       "        0.20659417, 0.28631724, 0.29237019, 0.19985078, 0.32695278,\n",
       "        0.41088896, 0.22575269, 0.30481535, 0.19058928, 0.16029785,\n",
       "        0.3102572 ]),\n",
       " 'std_score_time': array([0.00695328, 0.0042614 , 0.00260264, 0.00549218, 0.00836309,\n",
       "        0.00810668, 0.00688729, 0.00368092, 0.00345661, 0.00471183,\n",
       "        0.00143892, 0.01447319, 0.00873077, 0.0021329 , 0.00813943,\n",
       "        0.00442317]),\n",
       " 'std_test_score': array([0.00108187, 0.00103497, 0.00120595, 0.00100004, 0.00116162,\n",
       "        0.00106835, 0.00105582, 0.00103801, 0.0010757 , 0.00102206,\n",
       "        0.00109364, 0.00103834, 0.00100696, 0.00109301, 0.00109818,\n",
       "        0.00113468]),\n",
       " 'std_train_score': array([0.00036067, 0.00033693, 0.00029435, 0.00041294, 0.00034194,\n",
       "        0.00030142, 0.00023796, 0.00035193, 0.00033813, 0.00039144,\n",
       "        0.00027004, 0.00033491, 0.00024136, 0.00030479, 0.00026106,\n",
       "        0.00022412])}"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gsearch5_1.cv_results_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best: -0.063623 using {'reg_alpha': 0.1, 'reg_lambda': 0.5}\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZ4AAAELCAYAAADp1+D/AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJzs3Xd4VFX6wPHvmUkmvXcIEDD0DkmkqeBaEEWwAiJNUGnisqv+Vldd1l0VXVdXFEUEpaiAogI2WBURpUhCdUEiLUCAJKTXybTz++MOIUBCAmRyM8n5PA9PZu7c8k4S8s4p97xCSomiKIqi1BeD3gEoiqIoTYtKPIqiKEq9UolHURRFqVcq8SiKoij1SiUeRVEUpV6pxKMoiqLUK5V4FEVRlHqlEo+iKIpSr1TiURRFUeqVh94BNETh4eEyLi5O7zAURVHcyvbt27OllBE17acSTxXi4uJISUnROwxFURS3IoQ4Wpv9VFeboiiKUq9U4lEURVHqlUo8iqIoSr1SiUdRFEWpVyrxKIqiKPVKJR5FURSlXqnEoyiKotQrdR+PojQQjvJyitevR1qtGENCMAYHV3w1+PkhhNA7REWpEyrxKIrO7IWF5C1fQe7SJdhPZ1e9k6cnxuAgPILPTUhnvwZjDA7Go9J2Q0CASlZKg6QSj6LoxJqZSe7iJeSvWIGjpAS/fv0InT0bz2bNsOflY8/Px56Xp33N177anM/LDx1ybs8Hu73qCxiNWhKqKjFdkMCc+wUFIQyqB15xLZV4FKWelR86RM7C9yj44guw2wkcPJiwSRPx7tTp7E6ta3cu6XDgKC6uSFBnEtMFiSsvD+vRY5Tt3o09vwCs1qpPaDBgDAysVYuq4mtgIMJD/SlxZ1aHlb3Ze0nJTCHKN4qhVw116fXUb4ui1JPSHTvJWbCA4vXrEd7ehNxzD6EPTMAUG3vZ5xRnEkVgILRqVatjpJQ4SkoqJai8c5JU5eRlPXkS89692PPykBZLtec0BAVdWldgcDDC0/Oy37dyZWwOG7/l/Ma2jG0kZySzI2sHZbYyAIZdNUwlHkVxZ9LhoHjDj+QsXEjZ9u0Yg4IInzqVkPtH4xEaqktMQgiM/v4Y/f2hlklPSoksK6uxVWXPz8d6Ogvzgd+x5+Ujy8qqPafB3/9sYqqpVeXcx+DlVVffhibF7rCzP28/yaeS2ZaxjR1ZOyixlgDQJqgNt191O4nRiSREJRDmE+byeFTiURQXkBYLBV9+Rc57C7EcPIRHsxiinnqK4LvvwuDrq3d4l0wIgfD1xeDri2ezZrU+zmE2V4xFVdsd6HzNcuQI9rw8HCUl1cfh64tHRaKqXXegwcenLr4FbsUhHaTmppKckUxyRjLbM7dTZC0CIC4wjiGth5AUnURCdALhPuH1Hp9KPIpSh+zFJeR/8gm5ixdjy8jAq107mv3rZQIHD26SXUsGb28M0dF4RkfX+hhpsWCrSEhVt6pszu5By/Hj2PPzcRQWVns+4e1dKREFXWSCRYgzcQUjfH3dakagQzo4kHeAlMwUtp3aRkpmCoUW7XvSMqAlN8XdRGJ0IonRiUT6RuocrUo8ilInbNnZ5C79gLxly3AUFuKblETMP57Db8AAt/oD1hAIkwnPyEg8I2v/B1LabNgLCmo1ycJ86jfteWEhSFl1DJ6elzbBIjgYg79/vf2spZQcyj9EcqbWoknJSCGvPA+A5v7Nub7l9SRFJ5EYnUi0X+2Tfn1RiUdRroAlLY2c9xdR8PnnSKuVgBtvJGzSRHy6ddM7tCZFeHjgERaGR1jtxyek3Y69sLBSl1/eOZMtKiev8oMHtWRVUFD99HUPj4oWkzGoqq7A81tcwRgCA2s1fV1KyZHCIySfSq5INrnmXABi/GK4JvYaEqMTSYpOopl/7btC9aISj6JchrJffyVnwUKK/vtfhIcHQXfcQeiE8Xi1ruU8aEV3wmjEIyQEj5CQWh8jHQ4cRUUVrSfbRboDLWlHKl7HZqv6hAYDxqCgC5KTMTiEIh84InJItZ1gp+UQ6cYCinzANzSSfs36VYzRxPrHul2rWshqmpp1cnIhBgOvA0ZggZRy9nmvewFLgN5ADjBCSpnmfK0b8A4QCDiARCmlWQixFohBS5o/AdOklHYhRA9gHuAN2ICpUsptQoiBwGrgiPOyn0kpn7tY3AkJCVKVvlbOJ6Wk5OdN5CxYQOkvv2AICCBk1ChCx9yPR0SNZeaVJqpi+vp5iakicTkfl2ZnUpKdgT0/H1OxGc9qchVCaFPoq5xg4UxcISHaJIwz24OC6mWMUQixXUqZUNN+LmvxCCGMwFzgRiAdSBZCrJFS7qu020QgT0oZL4QYCbwEjBBCeAAfAGOklLuFEGHAmTve7pVSFgotxa8E7gGWAy8Df5dSfiOEGOJ8PtB5zE9Syttc9V6Vxk3abBR+s5achQsp378fj6goIp94guB779GmJCvKRZwzfb1Fi4rtJ4pPOGedZbEtYy8ZJRkAhHqHkhh1PVeH9KS3VzwxtoALZgZWXtHCmpWJOTUVe34N09cDAs4Zr/I4M8Ei5NyJFp7NYjBVitMVXNnVlgQclFIeBhBCLAeGAZUTzzBglvPxSuBNZ0K5CdgjpdwNIKXMOXOAlPLM9BUPwAScabJJtNYRQBBwso7fj9LEOEpLyf/0M3Lffx/ryZOYrrqKmOefJ2jobQiTSe/wFDeTUZJRccNmckYyJ4pPABDiFUJCdAIPdHmApOgk2gS1ueyus4rp6+e3qvLysOefnXxhz8nFclBbdun86esBtwwm9rXXrvj9XowrE09z4Hil5+nA1dXtI6W0CSEKgDCgHSCFEOuACGC5lPLlMwc5tycB36AlLIA/AuuEEK+glXvoV+k6fYUQu9GS0WNSyr118xaVxsiWl0feBx+S9+GH2PPz8enVi6in/4r/wIFqHTOl1rJKs85JNMeLtD+HQV5BJEQlMKbTGBKjE4kPjscg6ub36nKmrzsslnNmABoDXN+Kd2XiqSplnz+gVN0+HsAAIBEoBb539h1+DyClvFkI4Q18CFwPfAtMAWZKKT8VQtwLLARuAHYAraSUxc4uuFVA2wuCFeIh4CGAli1bXup7VRoBS/oJct9/n/xPP0Wazfhffz1hkybi26uX3qEpbiC7LJvkDG1lgJSMFNIK0wAI8Aygd3RvRnUYRWJ0Iu1C2tVZoqkLBpMJwyVOX79Srkw86UDljsJYLuz+OrNPunNcJwjIdW7/UUqZDSCE+BroBXx/5kDnRIM1aN113wLjgEedL38CLHDuV1jpmK+FEG8JIcLPnLvSa/OB+aBNLriC9624GfNvv5GzYCGFa9eCwUDQbbcRNvEBvOLj9Q5NacByynJIyUypSDZHCrT5S36efvSO6s3d7e4mMTqR9iHtMRqMOkfbsLgy8SQDbYUQrYETwEjgvvP2WYOWMLYAdwPrpZRnutieEEL4AhbgOuA1IYQ/ECClPOVMVEPQZraBltSuAzagtYIOAAghooFM53mT0LrhKsaMlKZJSknpL7+Q8+4CSjZtwuDrS+jYsYSOG3tJ3RRK05FnzmN75vaK7rOD+QcB8PHwoVdUL4bHDycpOokOoR3wMKg7VS7GZd8d55jNdGAd2nTq96SUe4UQzwEpUso1aN1hS4UQB9FaOiOdx+YJIV5FS14S+FpK+ZUQIgpY45yGbQTWo02hBngQeN2ZkMw4u83QEtoUIYQNKANGSlfOIVcaNGm3U/Ttt+QsWIj5f//DGB5OxMyZhIwaqa3wrChOBeUFpGSmkJKRwraMbfye9zugJZqekT25tc2tJEYn0imsE56Gprcc0pVw6X087krdx9P4OMxmClatIue997EeO4apVStCH3iAoOHD1IrHCgBFlqKKFk1KRgr7c/cjkXgZvegR2YOk6CSSopPoHNYZT6NKNFXR/T4eRWkI7AUF5C1bRu7SD7Dn5ODdtSuRr79OwA1/QBhVv3tTVmItYXvm9ooxmv25+3FIByaDie6R3ZnSYwpJ0Ul0De+Kyaimz9cllXiURsl66pRWVvrjj3GUluJ3zTWETZqEb1Ki2y0votSNUmspO7N2VozR7MvZh13a8TR40i2iGw91e4ik6CS6RXTDy6hawa6kEo/SqJQfOKCVlf7yS5CSwCFDtLLS7dvrHZpSz8psZezM2lkxRrM3ey82acNDeNA1oqt2w2ZMEt0juuPj0fRq9uhJJR7F7UkpKduxg5x3F1C8YQPCx4eQUaMIGz8Oz+bN9Q5PqSdmm5ndp3dX3LC5J3sPNocNozDSObwz47uMJzEqkR6RPfD1dL9ifI2JSjyK25IOB8U//EDOuwso27ULY0gI4Y9MJ+S++y5pxWHFPVnslnMSze7Tu7E6rBiEgU6hnRjTaQxJ0Un0jOyJn6ef3uEqlajEo7gdh8VC4RdfkLPwPSyHD+PZvDlRzzxN8J13Nskyx02F1W7l1+xfK8Zodp/eTbm9HIGgQ2gH7utwH0kxSfSK7IW/SS3e2pCpxKO4DXtxMfkrVpC7eAm2rCy8Onak2b9fIfDmmxEe6le5sbE6rOzN3lsx62xX1i7MdjMCQfvQ9tzT7h6SopPoHd2bQJO6B8udqP+tSoNnzcoib+lS8pYtx1FcjG/fPsS8+AJ+/fqpGWqNiM1hY1/Ovoqusx1ZOyizacv8tw1py13t7iIxKpGE6ASCvIJ0jla5EirxKA1W+ZEj5L73PgWrViHtdgJuvomwiZPw6dJZ79CUOmB32Nmfu7+i62xH1g5KrNoS/VcFXcWwq4aRFJNE76jehHqH6hytUpdU4lEanLLdu7Wy0t99hzCZCLr7LsImTMCkVg13aw7pIDU3tSLRbM/cTrG1GIC4wDhubX0riTGJJEQlEO4TrnO0iiupxKM0CFJKSjZuJGfBQkqTkzEEBRE2+WFC778fj7AwvcNTLoNDOjiQd6BijGZ75nYKLdpi8a0CW3Fz3M0kRSeRGJ1IhK8qHd6UqMSj6EparRR+/TU5CxZSfuAAHjExRD35F4LvvhuDn5oC606klBzMP1gxRpOSmUJ+eT4Asf6x/KHlH0iMTiQxOpFoP7UCeFOmEo+iC0dJCfmffkrOokXYTp7Cq21bmr00m8AhQxCeagFGdyCl5EjBkbPFzzJTyDXnAtDMrxnXxV5HYnQiSdFJxPjH6Byt0pCoxKPUK1tODnkffkjuhx/hKCjANyGBmL/9Db9rr1Uz1Bo4KSVHC4+SnJlM8qlkkjOTyS7T6ilG+UbRv1n/ihZNbECsztEqDZlKPEq9sBw/7iwr/RnSYiHghj8QNnEiPj166B2aUg0pJelF6dpkAGeyySrLAiDCJ6KiTEBSdBKxAbHqg4NSayrxKC5VtncvuQsXUrh2HcJoJGj4MEInPIBXm9Z6h6ZU4UTxCbad0madJWcmk1GSAUCYdxhJ0UkkRCeQFJ1Eq8BWKtEol00lHqXOSSkp3bKFnAULKNm8BYO/P2ETHyDk/jF4RkXqHZ5SSUZJBtsytrHtlDZGc6L4BACh3qEkRCUwqcskEqMTaR3UWiUapc6oxKPUGSklRevWkTP/Xcz79uEREUHk448RfO+9GAMC9A5PATJLMrVus4xktp3aRnpxOgBBXkEkRiUyttNYEqMTiQ+OV4lGcRmVeJQ64bBYyJj1dwo++wxT69bEPP9PAocOxWBSlRv1lF2WrXWdOZPN0cKjAASYAkiISmB0x9EkRifSNqQtBmHQOVqlqVCJR7litpwc0h+ZQdmOHYRPm0b4tKkIg/ojpoecshySM5Mrip8dKTgCgL+nP72jelcsrNkupB1Ggyr9rehDJR7liphTUzk+ZQr23Dyav/YqgbfcondITUqeOY+UzJSKMZqD+QcB8PP0o1dkL+6Iv4Ok6CQ6hHZQiUZpMFTiUS5b0XffceKJ/8Po70+rDz5Qi3fWg4LyAlIyUypu2jyQdwAAHw8fekX24rY2t5EYnUinsE54GNR/b6VhUr+ZyiWTUpLzznxO/+c/eHftSuybb6rZai5SaClkR+aOioU1U3NTkUi8jd70iOzBLT1vITE6kc7hnfE0qBUfFPegEo9ySRxmM6eefobCL78k8LbbiPnnPzB4e+sdVqNRYi1he+b2ihbN/tz9OKQDk8FEj8geTO0xlaToJLqEd8FkVBM3FPekEo9Sa9asLNKnP4J5zx4iZs4k7KEH1ZTbOpRdls1da+4i15yLp8GT7hHdebjbwyRGJ9ItohteRi+9Q1SUOqESj1IrZf/bS/q0adiLioh98w0CbrhB75AanQW/LqCgvIA3rn+DPjF98PZQLUmlcVJzXpUaFa5dy9H77wejgbiPPlRJxwVOFp/k49SPGR4/nIEtBqqkozRqqsWjVEs6HGTPfYvsuXPx6dWL2DfmqKJsLvLWrrcQCCZ3n6x3KIricirxKFVylJZy8smnKFq3jqA77yR61t/UKgQucjj/MF8c/oLRHUerAmlKk6ASj3IB66lTHJ82jfLf9hP5xBOEThivJhG40Ju73sTb6M2krpP0DkVR6oVKPMo5ynbt4vj0R5BlZbSY9zb+112nd0iN2t7svXx79FumdJ9CqHeo3uEoSr1QkwuUCgWrV3N07DgMPj7ErViukk49mLNzDsFewYztNFbvUBSl3rg08QghBgshUoUQB4UQf6nidS8hxArn678IIeIqvdZNCLFFCLFXCPGrEMLbuX2tEGK3c/s8IYTRub2HEGKrEGKXECJFCJHk3C6EEHOc19gjhOjlyvfsjqTDQda//83J//sLPj16EPfxCrzi4/UOq9FLzkhm88nNTOo6CX+Tv97hKEq9cVnicSaEucAtQCdglBCi03m7TQTypJTxwGvAS85jPYAPgMlSys7AQMDqPOZeKWV3oAsQAdzj3P4y8HcpZQ/gWedznNdv6/z3EPB23b5T92YvLiF92nRy3l1A8IgRtFy4AI+QEL3DavSklPxnx3+I9I1kRPsReoejKPXKlS2eJOCglPKwlNICLAeGnbfPMGCx8/FK4A9CG8W+CdgjpdwNIKXMkVLanY8Lnft7ACZAOp9LIND5OAg4WekaS6RmKxAshIipw/fptizpJzh6330Ub9xI1DNPEz3rbwhPtd5XfdhwfAN7Tu9hSvcp6p4dpclx5eSC5sDxSs/Tgaur20dKaRNCFABhQDtACiHWobVqlkspz7RgcG5PAr5BS1gAfwTWCSFeQUuo/S4SR3Pg1JW+QXdWmpJC+iMzkHY7Ld+dj1+/fjUfpNQJh3QwZ+ccWga0ZFj8+Z/FFKXxc2WLp6r5t7KW+3gAA4DRzq93CCH+ULGDlDcDMYAXcL1z8xRgppSyBTATWHgJcSCEeMg5NpRy+vTpat9UY5C/ciVHJzyAMTiYuBXLVdKpZ18f+ZqD+QeZ3nO6WlFaaZJcmXjSgRaVnsdytvvrgn2c4zpBQK5z+49SymwpZSnwNXDOpAAppRlYw9nuu3HAZ87Hn6C1iGobB1LK+VLKBCllQkRExCW8TfchbTYyX5zNqaefwS8pibgVy/Fq3VrvsJoUq93K3J1zaR/SnpvjbtY7HEXRhSsTTzLQVgjRWghhAkaiJYrK1qAlDIC7gfVSSgmsA7oJIXydCek6YJ8Qwv/M+Ixz+xBgv/P4k879QGsFHah0jbHO2W19gAIpZZPrZrMXFXF8ylRyFy8mZMwYWrwzD2NgYM0HKnXq84Ofk16czoxeMzAIdTeD0jS5bIzHOWYzHS2JGIH3pJR7hRDPASlSyjVo3WFLhRAH0Vo6I53H5gkhXkVLXhL4Wkr5lRAiClgjhPBynnM9MM95yQeB150JyYw2gw201tIQ4CBQCkxw1XtuqCxpaRyfOg3LsWNE//3vhIy4V++QmqQyWxnzds+jZ2RPrml+jd7hKIpuhNbAUCpLSEiQKSkpeodRJ0q2bCH9jzMRQtB8zuv4JSXVfJDiEu/97z1e2/4aiwYvondUb73DUZQ6J4TYLqVMqGk/1dZvxHI/+ohjkx7EMzKCuE8+VklHR0WWIhb+upABzQeopKM0eWqttkZIWq1kvPAC+cuW4z9wIM1e+RdGf3VnvJ4W7V1EoaWQGT1n6B2KouhOJZ5Gxp6fT/ofZ1K6dSthkyYSMXMmwmjUO6wmLbssm6X7lnJz3M10DOuodziKojuVeBqR8kOHOD51KraTp4iZ/SLBw4frHZKCVtLaYrcwvcd0vUNRlAZBJZ5Govinnzgx808ILy9aLl6Mb6+eeoekcLak9bD4YcQFxekdjqI0CGpygZuTUpK7eDHHH56MZ2wsrT/5WCWdBuTt3W8jEEzpPkXvUBSlwVAtHjcmLRZOPfccBSs/JeDGG2g2ezYGPz+9w1KcDucfZs2hNaqktaKcRyUeN2XLzSV9xgzKUrYTPnUK4dOnIwyqAduQqJLWilI1lXjckDn1d9KnTMGWk0Ozf79C0K236h2Scp69OVpJ68ndJ6uS1opyHpV43EzR+vWcfOxxDH5+tPpgKT5du+odklKFOTu0ktbjOo2reWdFaWJU34ybkFKSPf9d0qdNx9SmDXErP1FJp4FSJa0V5eJUi8cNOMrLOfXMMxSu+YLAIUOIeeF5DN6qamVDJKXk9R2vq5LWinIRqsVTl8qLYdPrYCmps1PaTp/m6NixFK75gohHZ9Ds36+opNOA/Zj+I7tP72Zy98mqpLWiVEO1eOpS1j749lmQDhgw84pPV7Z3L+nTpmMvKKD5nNcJvOmmOghScZXKJa2Hx6tVIxSlOqrFU5daJEHbm7RWj7nwik5VuHYdR0ffD0IQ99GHKum4gW+OfMOBvANM6zFNlbRWlItQiaeuDXoKyvJg69uXdbiUktNz53Lij3/Eu0MHWn/yMd4d1cKSDZ3VYWXuLq2k9eDWg/UOR1EaNJV46lqzntDhNtjyJpTmXtKhjrIyTvzpT2S/8SZBw4bRcsliPMLDXRSoUpc+P/A5x4uOq5LWilILl/Q/RAhhEEIEuiqYRmPQU1BepCWfWrJmZHB09P0UrV1H5OOPEzP7RQwmkwuDVOqK2WZWJa0V5RLUmHiEEB8JIQKFEH7APiBVCPG460NzY1GdocudsHUelGTXuHvZ7t0cueceLEePEvvWXMImPoAQoh4CVerCsv3LOF12mhk9Z6ifm6LUQm1aPJ2klIXAcOBroCUwxqVRNQYDnwRbGfz82kV3K/jiS46OGYvBy5u45csIGDSongJU6kKRpYiF/1tI/+b9SYiusdS8oijULvF4CiE80RLPaimlFZCuDasRCG8L3UZC8gIoPHXBy9LhIOu1/3Dy8cfx6daNuE8+xqttWx0CVa7Eor2LKCgvUCWtFeUS1CbxvAOkAX7ARiFEK+DK5go3Fdc9AQ4b/PTvczY7SkpIf2QGOe+8Q/A9d9PyvYV4hIToFKRyuXLKcli6byk3tbqJTmGd9A5HUdxGjYlHSjlHStlcSjlEao4Cqj+oNkJbQ8/7YfsiyD8GgPXECdLuG03xDz8Q9dRTRD/3HEJNInBLFSWte6qS1opyKWozueBR5+QCIYRYKITYAVxfD7E1Dtc+DkLAxn9Run07R+65F+vJk7SYP5/QsWPUYLSbOll8khWpKxgWP4zWQa31DkdR3EptutoecE4uuAmIACYAs10aVWMSFAu9J5D/6accHTceY0AAcStW4D+gv96RKVdg3u55AEzuNlnnSBTF/dRmrbYzH8mHAO9LKXcL9TG91qTdTlaKN7m/BOEX70/zD1dgDArSOyzlChwuOMzqQ6u5r8N9xPjH6B2Oorid2iSe7UKI/wKtgSeFEAGAw7VhNQ72oiJO/PnPlGz8iZBr44mK+RlhyQBU4nFnb+7USlo/2O1BvUNRFLdUm662icBfgEQpZSlgQutuUy7CcvQoaSNHUbJ5C9GzZhH92iKEly9seFHv0JQrcKak9djOY1VJa0W5TLWZ1eYAYoGnhRCvAP2klHtcHpkbK9n6C2n3jsCenU3LBQsIGTkC/MKgzxTY+zlk/Kp3iMplemPHGwR5BTG201i9Q1EUt1WbWW2zgUfRlsvZB8wQQqiP7dXIW76CY5MmYQwPJ+6Tj/Hrc/XZF/tOA68g+EF9+9xRckYym05uYlKXSQSYAvQOR1HcVm262oYAN0op35NSvgcMBm51bVjuqXjTJjJmzcKvfz/ili/D1LLluTv4hEC/RyD1KzixXZ8glctSUdLaJ5KRHUbqHY6iuLXark4dXOlxrUfGhRCDhRCpQoiDQoi/VPG6lxBihfP1X4QQcZVe6yaE2CKE2CuE+FUI4e3cvlYIsdu5fZ4QwujcvkIIscv5L00Iscu5PU4IUVbptXm1jf9S+fXrR7NXXqHFW29hDKjmE3GfyeATCj+84KowFBfYmL6R3ad383D3h1VJa0W5QrWZ1fYisFMI8QPa1OprgSdrOsiZEOYCNwLpQLIQYo2Ucl+l3SYCeVLKeCHESOAlYIQQwgP4ABjjnL4dBlidx9wrpSx0TuleCdwDLJdSjqh07X8DBZWuc0hK2aMW7/WKCCEIuq2GxqBXAAz4o1Yi++gWaNXX1WEpV6hySes72t6hdziK4vZqM7lgGdAH+Mz5ry+wsRbnTgIOSikPSyktwHJg2Hn7DAMWOx+vBP7gTCg3AXuklLudMeRIKe3Ox2fWifNAm2F3zoKlzuPvBZbVIkZ9JD4IfpHww/N6R6LUwjdHvuH3vN9VSWtFqSO16mqTUp6SUq6RUq6WUmYAW2txWHPgeKXn6c5tVe4jpbShtVLCgHaAFEKsE0LsEEI8UfkgIcQ6IAsoQktYlV0DZEopD1Ta1loIsVMI8aMQQv9KXSZfuObPkPYTHP5R72iUizhT0rpdSDtV0lpR6sjl1uitzcoFVe1zfjmF6vbxAAYAo51f7xBC/KFiBylvBmIALy5cN24U57Z2TgEtpZQ9gT8BH1VVRVUI8ZAQIkUIkXL69OmLvrE60Xs8BDaH9f8EqapMNFQVJa17qpLWilJXLvd/Um3+UqYDLSo9jwVOVrePc1wnCMh1bv9RSpntvGn1a6DXOQFIaQbWUKn7znmOO4EVlfYrl1LmOB9vBw6htajOfUNSzpdSJkgpEyIiImrx9q6Qpzdc+xikb4OD37n+esolM9vMvLP7HXpE9ODa2GsYLLHzAAAgAElEQVT1DkdRGo1qJxcIId6g6gQjOHeWW3WSgbZCiNbACWAkcN95+6wBxgFbgLuB9VJK6exKe0II4QtYgOuA14QQ/kCAlPKUM8kMAX6qdL4bgP1SyvRK7yMCyJVS2oUQbYC2wOFaxO96Pe6Hn/+jtXrib9BWsVYajGX7l5FVlsVL176kVhFXlDp0sVltKZf5GqCN2QghpgPrACPwnpRyrxDiOSBFSrkGWAgsFUIcRGvpjHQemyeEeBUteUngaynlV0KIKGCNEMLLec71QOXp0SO5cFLBtcBzQggbYAcmSylza4q/XniYYOBfYNUU2P8VdLxN74gUp4qS1s1USWtFqWtCqvGFCyQkJMiUlBpza92w2+Ctq8FogsmbwKDGERqCN3e+yTt73mHFbStUdVFFqSUhxHYpZY2f1NRfOb0ZPWDgk5C1D/Z+pnc0ClpJ6yX7lqiS1oriIirxNASd74TITrBhttYCUnS14NcFlNvLmdZzmt6hKEqjpBJPQ2AwwKCnIOcA/Pqx3tE0aaeKT2klra8aRpugNnqHoyiNUo1L5ggh5lSxuQBtgsDqug+piepwG8R011o9Xe8Bo7pDXg9v734bgCndp+gciaI0XrVp8XgDPYADzn/dgFBgohDiPy6MrWkRAgY9DflHYecHekfTJJ0paT2i/QhV0lpRXKg2i4TGA9c7l7RBCPE28F+0xT9VRbO61PZGiE2Cjf+C7qO0m0yVejN351y8jF5M6jpJ71AUpVGrTYunOeBX6bkf0My5aGe5S6JqqoSA6/8KhSdgx+Ka91fqzL6cffz36H8Z22ksYT5heoejKI1abRLPy8AuIcT7QohFwE7gFSGEH6DWeqlrra+DuGtg4ytgKdU7miZjzo45BHkFMa7zOL1DUZRGrzZlERYC/YBVzn8DpJQLpJQlUsrHXR1gkyMEDPorlGRB8gK9o2kSzpS0nthloipprSj1oLbTqRPRyg0MAHq7LhwF0IrDXfUH+Pk1KC/SO5pGTUrJnB1ziPSJZFSHUXqHoyhNQo2JRwgxG3gU2Of8N0MI8aKrA2vyrv8rlOXCLy6r1K2glbTedXqXKmmtKPWoNi2eIcCNUsr3pJTvAYOBGuo7K1eseW9oPwQ2vQFleXpH0yidKWndIqCFKmmtKPWotl1tlcsgBLkiEKUKg56C8gLYMlfvSBqltUfWqpLWiqKD2iSeF4GdQohFQojFwHbgBdeGpQAQ3RU6DYetb0NJjt7RNCpWh5U3d71Ju5B23NL6Fr3DURR92cqhKBNO/w55aS6/XI03kEoplwkhNqBNMBDA/6HWeKs/g56C39bApv/ATf/QO5pG40xJ6zevf1OVtFbcn5RgKYayfDDng7ngEh4XgK3s7Km63IW4+z2XhlublQuQUp5CqxYKgBDiGNDSVUEplUS019Zu2/Yu9J0OAVF6R+T2zpS07h7RXZW0VhoOu01LAmZnYjiTFC72uHLykPaLn98rCHyCwDsYvIMgvG3FY+kdzJEST9anleMj2jHaxW+1VomnCqoOcH267v/g15Xw86twy0t6R+P2lu9fTlZZFrOvna1KWit1R0qwmS+/1WGp4dYJgyf4OJOGdzD4hkFoG+1x5e1VPfYKBIPxglOWWmys2nmSxZvTSM0sItjXk4c7XeWib9BZl5t4VNnS+hR2FfQcDSnvQb9HIChW74jcVpGliAX/W0D/Zv1JjE7UOxyloXE4oLyw5pZGla2OfLBbLn5+k//ZpOAdBMEtIbqb9tgn+Oz2qh57+mg3mNeBYzmlLN2axork4xSabXSKCeTlu7pxe49meHtemKDqWrWJRwjxBlUnGMG5s9yU+nDt47BrmbaUzlC1KPjlWrJvCQXlBTzS6xG9Q1FcxWapOilUJIzzWhqVE0l5IUhH9ecWBmfiqNSiCGx2kVZHSKXHQbqWO5FS8vPBbBZvTuP7/VkYhGBwl2jG94sjoVVIvbb+L9biSbnM1xRXCG4JvcfD9veh/6MQ2lrviNxOrjmXJXuXcGOrG+kc1lnvcJTqSAmWkktraVR+bK1hjUMP73NbHf5REN6+dq0Ok79WuNGNFJfb+GxHOos3p3HodAlhfiamD4pn9NWtiA7S56bpahOPlPKC5ZGFENFSygzXhqRU65o/w86lWtmE4W/pHY3beXfPu5jtZqb3nK53KI2fw15zgqiu1WHOB0cNJeC9As9NCrUd6/AObjLlRo5kl7B4cxqfbk+nqNxG99ggXr23O7d2i8HLw/XdaRdzqWM8XwO9XBGIUguBMZA4Cba+BQNmarNSlFpRJa0vg9Vci1bH+a85v5YXXvzcBo8Lk0Jwq3MTRHWtDq9AMF7u8HTj5nBIfjxwmsWb09iQehpPo2BI1xjG94ujZ8sQvcOrcKk/PTUFSG/9/wgp72slsu9eqHc0bmPeHm3NuyZV0lpKbZHZS2lpVH5sM1/8/J6+5yaFwFiI7FxFsqii1WHyq7OBcgUKzVZWpqSzdOtRjmSXEBHgxR9vaMt9V7ckMqDhtfAuNfG865IolNrzj4CrH9ZWrr7mTxClxipqcqTgCKsOruK+Dve5X0lruxXMhecNjF/CVN2LDZQjwDvw3KQQ0b6KZFHNuIeHqd6+DUrVDmYVsXjzUT7bkU6JxU6vlsH8cWQPbukSg8mj4Y5FXVLikVKqgYWGoN8jWq2eH16AkR/qHU2D9+bON92jpHVJNnz1Z8g+cLbVYSm++DFG07lJwTccQq+qYZA86GyXlZsNlCtgd0jW789i8eY0fj6YjcloYGj3ZozvF0fXWPdYSlN1lLoj31DoOw02vAgnd0KznnpH1GCdKWn9ULeHGnZJ6/xjsPQOKEjXajHVZpDcO6hO7+1QGraCUisfpxxnydY0jueWER3ozWM3tWNkUkvC/b30Du+SqMTjrvpM0Wr1/PACjP5E72garDk7tZLW4zuP1zuU6mXugw/u1Eqdj/kcWvXTOyKlAUnNKGLR5jRW7TxBmdVOUlwofxnckZs6R+FpdM8Wq0o87so7CPrNgO//Dse3QYskvSNqcFIyUth0YhN/6v2nhlvS+thW+Ohe8PCBB75RY3YKADa7g+9+y2TR5jS2Hs7Fy8PA8B7NGdcvjk7NAvUO74qpxOPOrn5Ym1q9/p8wbk3N+zchUkrm7JxDhE8EIzuM1DucqqWuhU/GQWBzraUT0krviBSd5ZVYWJ58nA+2HuVEfhnNg334yy0dGJHQghC/xjOZQyUed2bygwF/gnVPwpGfoPU1ekfUYPx04id2Zu3kmT7P4OPho3c4F9r5Iax5RKu5NHqlNltRabL2nixg8eY0Vu86SbnNQd82YTw7tBM3dIzCaGh8Y3gq8bi7hAdg8xz44XmI+0YNNOMsab2jAZe03vQ6fPsstBkIIz4ArwbaDai4lNXuYN3eDBZvTiM5LQ8fTyN39Y5lXN842kc37t8JlXjcnac3XPuYNg330PcQf4PeEelu7ZG1pOalMvua2Q2rpLXDAd89C5vfgM53wB3vgId7zUZSrlx2cTnLfjnGh78cI6PQTMtQX56+tSP39G5BkG8D+n11IZcmHiHEYOB1wAgskFLOPu91L2AJ0BvIAUZIKdOcr3UD3gECAQeQKKU0CyHWAjHO2H8Cpkkp7UKIFUB756mDgXwpZQ/nuZ4EJgJ2YIaUcp3r3rUOeo6Fn1+H9c9rU3GbcKvH6rAyd9dc2oa0bVglre1WrWtt9zJIfFCrq1RFfRSl8dp9PJ/Fm9P4cs8pLHYH17QN5/k7ujCwfWSj7E67GJclHiGEEZgL3AikA8lCiDVSyn2VdpsI5Ekp44UQI4GXgBFCCA/gA2CMlHK3ECIMsDqPuVdKWSi0NbxXAvcAy6WUIypd+99AgfNxJ2Ak0BloBnwnhGgnZU3l+tyIhwmuewLWTIfUb6DDEL0j0s2qg6s4VnSMN65/o+GUtLaUwifj4cA6GPiU9rNqwh8OmhKLzcE3/zvFos1p7DyWj5/JyMikFoztG0d8pL/e4enGlS2eJOCglPIwgBBiOTAMqJx4hgGznI9XAm86E8pNwB4p5W4AKWXOmQOklGdWH/QATJxXM8h5/L3A9ZWusVxKWQ4cEUIcdMa2pW7eZgPRfZRWofSHF6Dd4CZ5R7rZZmbernl0j+jOdbHX6R2OpjQXlo3Uprzf+iokTtQ7IqUeZBWa+fCXY3y07Rini8ppHe7H34Z24u7esQR4N43utItxZeJpDhyv9DwduLq6faSUNiFEARAGtAOkEGIdEIGWOF4+c5BzexLwDVrCquwaIFNKeaDSNbaeF0fzK3hfDZPRAwY+CZ89CL+t1sYQmpgVqSsaVknrghPwwV2QewjuXQydhukdkeJCUkp2HNO607753ymsdsmg9hGM6xfHtW0jMDSx7rSLcWXiqeq7fH5F0+r28QAGAIlAKfC9EGK7lPJ7ACnlzUIIb+BDtJbNt5WOHwUsu8Q4EEI8BDwE0LJly6reT8PX5S746d/ww4vQ8fYmNYZQbClmwa8L6NesX8MoaX36d201grJ8uP9TaH2t3hE1SFarlfT0dMzmGlbCbsCklJRZ7RSbbVjskmFxMKpdLP5eRjyMBnDkkJqaU+N53Im3tzexsbF4el5e682ViScdaFHpeSxwspp90p3jOkFArnP7j1LKbAAhxJk6QN+fOdA50WANWlfat879PIA70SYrXEocSCnnA/MBEhISqir53fAZjFqr55Nx8OtK6D6i5mMaicX7FpNfns+MXjP0DgXSt8OHd2s/j/FfQrMeekfUYKWnpxMQEEBcXFzDaKVeAovNQW6JhdwSC54OB9EeRsL9TQT7mhr1ZAEpJTk5OaSnp9O69eVVQnblQEAy0FYI0VoIYUIb4D//9vo1wDjn47uB9VJKCawDugkhfJ3J5DpgnxDCXwgRAxVJZgiwv9L5bgD2SynTz7vGSCGElxCiNdAW2Fan77Qh6Xi7dlPihhe1mVRNQIMqaX3we1g8VLs354F1KunUwGw2ExYW5jZJR0pJSbmNozklpGYUkVVkxtdkpHW4H+2i/Anz92rUSQdACEFYWNgVtVJd1uJxjtlMR0siRuA9KeVeIcRzQIqUcg2wEFjqHPDPRUtOSCnzhBCvoiUvCXwtpfxKCBEFrHFOwzYC64F5lS47knO72XBe82O0SQ02nNOvXfW+dWcwwKC/agPau5dBr7F6R+RyC35doJW07qFzSetfV8LnkyGiA9y/EgKi9Y3HTbhD0nE4JPllFrKLLZitdowGQXiAiTA/Eyady0jr4Up/Zi69j0dK+TVauezK256t9NiMNh26qmM/QJtSXXlbJtq4T3XXG1/N9ueB52sbt9trNxia94YfX4ZuIxr1TYoZJRms2L+C26+6nTbBOpa03joP1v4ftOoPo5Zpi7gqbs9is5Pj7E6zOyTenkaah/gQ4mNSkwWuQNObc9sUCAHXPw0Fx2HHEr2jcam3d7+NROpX0lpK+P4fWtLpcBvc/5lKOm5OSkmx2VrRnZZdVI6/lwdtIvxpG+lPmJ/XZSedDRs2cNttt13xPhcjpWTGjBnEx8fTrVs3duzYUeV+27dvp2vXrsTHxzNjxgy0UQ745JNP6Ny5MwaDgZSUlMuO42JU4mms2gyClv1g4ytgLdM7Gpc4UnCE1QdXc2/7e2nm36z+A7Db4ItH4adXoOcYuGextoSR4pbsDkl2kZnUjEIOZ5dQUm4jPMCL9tGBtArzw9/Lwy26Bb/55hsOHDjAgQMHmD9/PlOmVP2hbMqUKcyfP79i37Vr1wLQpUsXPvvsM6691nUzMVXiaazOtHqKMyB5od7RuMTcXXMxGU082PXB+r+41azNHtyxGK75M9z+hnYvleJ2Ug8eom37Doye8CAD+iax+pNlTLxrMPffNogZk8ZiMZcC8PXXX9OhQwcGDBjAjBkzLtoq2bZtG/369aNnz57069eP1NTUC/aZNWsWY8aM4frrr6dt27a8++67Fa8VFxdz991306FDB0aPHl3RGnnuuedITEykS5cuPPTQQxXbK1u9ejVjx45FCEGfPn3Iz8/n1KlT5+xz6tQpCgsL6du3L0IIxo4dy6pVqwDo2LEj7du3v+C8dUn9T2nM4vprKyD//Br0Hg9ejWeJjn05+1iXtk6fktbmAlh2Hxz9GQa/BH0m1+/1G6m/f7GXfScLa97xEnRqFsjfhl4401FKSXG5jZxiC4dPl3DowO/8a87bvPTCPxkz6l42rP8ePz8/XnrpJV599VWeeOIJHn74YTZu3Ejr1q0ZNWrURa/boUMHNm7ciIeHB9999x1PPfUUn3766QX77dmzh61bt1JSUkLPnj259dZbAdi5cyd79+6lWbNm9O/fn02bNjFgwACmT5/Os89qw+Rjxozhyy+/ZOjQocybp82xmjx5MidOnKBFi7N3kMTGxnLixAliYmIqtp04cYLY2NgL9qkvKvE0doOehoU3wLZ3tE/mjcQbO98g0BTIuM7jat65LhVlaqsRnP4N7lwA3aqcG6M0UHaHJK/UQk6xhXKbHQ+DgXA/L1q1asXwmwfx5Zdfsm/fPvr37w+AxWKhb9++7N+/nzZt2lTctzJq1Cjmz59f7XUKCgoYN24cBw4cQAiB1Vr1rQ3Dhg3Dx8cHHx8fBg0axLZt2wgODiYpKakiMfTo0YO0tDQGDBjADz/8wMsvv0xpaSm5ubl07tyZoUOHMnny2Q8/VbWCzu8irM0+rqQST2PXIlGb5bZpDiROahQD39szt/PziZ+Z2XsmgaZ6LAOcexiW3gHFWXDfClWCoo5V1TKpK+VWbXZaXokFu5T4moy0CPElyNeTY5Zc/Pz8AO0P8o033siyZefclcHOnTsv6XrPPPMMgwYN4vPPPyctLY2BAwdWud/5f+zPPPfyOjsT1Wg0YrPZMJvNTJ06lZSUFFq0aMGsWbOqvJcmNjaW48fPrlaWnp5Os2bNLtgnPT39ovu4khrjaQoGPQXmfNjylt6RXDEpJa/veJ0InwhGdbh4d0edOrUbFt4M5kIY94VKOm5ASklhmZUj2SWkZhaRU2IhwMeT+Ah/4iMDCPEzYTjvD3+fPn3YtGkTBw8eBKC0tJTff/+dDh06cPjwYdLS0gBYsWLFRa9dUFBA8+bakpCLFi2qdr/Vq1djNpvJyclhw4YNJCZWv9zTmSQTHh5OcXExK1eev0yl5vbbb2fJkiVIKdm6dStBQUHndLMBxMTEEBAQwNatW5FSsmTJEoYNq7+1BFXiaQpiumsrGmyZq62W7MbOlLSe3H1y/ZW0PvITvH8rGE3aagSxCfVzXeWy2B0OTheV83tmEWk5JZitdqICvekQHUDLUF98varv6ImIiGDRokWMGjWKbt260adPH/bv34+Pjw9vvfUWgwcPZsCAAURFRREUVH3vwRNPPMGTTz5J//79sdurv189KSmJW2+9lT59+vDMM89ctNURHBzMgw8+SNeuXRk+fPg5SWrevHkV4zxDhgyhTZs2xMfH8+CDD/LWW2c/cPbocXYljbfffptJkyYRHx/PVVddxS23aPWrPv/8c2JjY9myZQu33norN998c7UxXS5RVV9fU5eQkCBdNX9dN1m/wVt9YcAf4YZZekdzWRzSwb1f3EuJtYQ1w9fgaayH5eX3rYFPJ0JoG+0enaDGt7C5nn777Tc6duxYJ+cyW+3kFFvIK7XgkBJfkwfh/iYCfTwvaNlcjuLiYvz9/ZFSMm3aNNq2bcvMmTMv+3yzZs3C39+fxx577Ipj00NVPzvnYs41fjJTLZ6mIrIjdL0bfnlHG6NwQ+vS1pGal8q0ntPqJ+mkvK9NmY7pARO+UUmnATrTnXb4dDG/ZxaRW2ohyMeT+Eh/4iP9Cfa9sDvtcr377rv06NGDzp07U1BQwMMPP1wn522KVIunCo2yxQOQfRDmJsLVU2DwC3pHc0msDivDVw3Hy8OLlUNXura6qJSw8V/ww/PQ9ibtxlCTr+uu14RdbovHZndos9NKLFhsDjyNBsL8TIT6mbRSBPXk/fff5/XXXz9nW//+/Zk7d269xaCXK2nxqFltTUl4PHS/D5IXQL/pEKjD3f6XafXB1RwrOsacQXNcm3QcDm35m23zodtIGPYm1EfrSqmVMqudnOJy8kutOKTEz8uDmEBvAn08dVlVYMKECUyYMKHer+vuVFdbU3PdEyAd2lI6bsJsM/P27rfpHtGdgS0Guu5CNgt8NklLOn2nw/C3VdJpAKSUFJRZOHS6mAOZReSXWgn29aRtZABXRfgT5Gtyi6VslLNUi6epCWkFvcZoi4f2f1R73sCtSF1BVmkWs69xYUnr8iJYMQYO/wA3Pqd9bxRd2ewOcp03e1rtDkxGA9FB3oT61m93mlL31E+vKbrmMRAG2Piy3pHU6ExJ674xfV1X0rokWyvedmQjDHtLJR2dlVlsHM8t5beMIjIKzHh5GGgV5kf76AAiA7xV0mkEVIunKQpqDgkPaF1KA/4EYVfpHVG1luxbQn55Po/2clEyyD+mrUZQkA4jP4T2t7jmOspFOZyz03KKLZRYbBiEINTXkzB/L7w9m16htcZOfXRoqgbM1ArEbZitdyTVyjXnsnjvYq2kdbgLllPJ3AcLb4KS0zBmlUo6OrA7JJmFZlIzijiWW4rV4SAmyIcOMQE0D/FtdEmnIdXj+etf/0qLFi3w96//xYNV4mmqAqIg6SH49RPI2q93NFVyaUnrY1vh/cHa4wnfQKu+dX8NpVq7j+fzpxW7yCg0k1modafFhfnRPiqAiAAvPAz6/GmSUuJwOHS5dl2pbT2eoUOHsm3btnqOTqMST1PW/1Ew+cOGhndPz5mS1kPbDK37ktapa2HJMPCL0JbAiXLd4pTKWRabg1U7TzB87iaGzd3Eur0Z+JmMtIsKoE2Ev25TotPS0ujYsSNTp06lV69eLF26lL59+9KrVy/uueceiouLgcZVjwe0denOX8OtvqgxnqbMNxT6ToUfX4JTeyCmm94RVZi3ex4SydQeU+v2xDs/hDWPaO919ErwC6/b8ysXyCo088Evx/jol2NkF5fTJtyPWUM7cVfvWNKPHDzbnfbNXyDj17q9eHRXuKXm7uTU1FTef/99nnvuOe68806+++67Rl2PR28q8TR1fabCL/PghxfgvuV6RwNAWkEaqw6uYmSHkXVb0nrT6/Dts1pxvBEfgFdA3Z1bOYeUkh3H8lm8OY2vfz2FXUoGtY9kXL84rokPx2BoWPfdtGrVij59+jSZejx6U4mnqfMJhn4zYP0/ID2lQay8fKak9aSuk+rmhA4HfPcsbH4DOt8Jd8zTJlYodc5stfPlnlMs3pzGrycKCPDyYGzfOMb2bUVcuN/FD65Fy8RVmlo9Hr2pMR4Frp4MvmHa2mQ6+y3nN9amreX+jvcT7lMH3WB2K6yeqiWdpIfgroUq6bjAqYIy/rVuP/1mr+exT3Zjttr5x/AubH3qDzw7tFPNSaeBaCr1ePSmEk8dklJW2cxt8Lz8tenVh9ZD2iZdQ5mzcw6BpkDGdxl/5SezlMLy0bB7GQz6K9zyMug0W6oxklKy7UguUz/czoCXfuCtDYfo3SqEDyddzX9nXsuYPq3wu0jtm4aoKdXjeeKJJ4iNjaW0tJTY2FhmzZpVm29RnVCrU1fhclen3nuygDve2ky4n4lQfxNhfl6E+ZkI8zcR6udFmL/J+fzsdl9TA/mPaSmFOT21m0nHfwU69Alvz9zO+LXjmdl7Jg90eeDKTlaaC8tGQnoy3Ppv7YZZpU6YrXZW7zrBos1H+e1UIUE+noxMbMH9fVrRIvTSVvGuy3o8rqbq8ZxLrU7dQAT5eDKhfxw5xRZySyzkFJdz6HQxOcUWyqxVf+rx9jRoCcpfW9I9rFKCCvUzEe7vpW13JjIfk4tuqDP5wjV/hm8eh8Mb4KpBrrlONaSUzNkxp25KWhecgA/ugtxDWkmDTrfXTZBNXHpeKUu3HmVF8nHyS610iA7gxTu7MrxHc9f9XjYg7777LosXL8ZisdCzZ09Vj+cKqBZPFVxRj6fUYjubkErKySnWaonklljILi53Jqqzz8ttVd/E5msyOhORs9XkbF2F+52boM4ksku689tWDnN6QUA0TPquXls9G9M3Mu37aTx99dOM6DDi8k90+nf44E4oy4dRH0Hra+suyCZISsmWQzks2pzGd79lIoTgpk5RjOsXx9WtQ694tpQ7tXiqourxqBZPg+Zr8sA31KNWXRFSSkosdnKLLWSXlJNb7ExW5yWnzEIz+04WkltiwWKvOlH5e3lUSkhaUgqt6PJzPq/UsjJd9zh88Sgc+C+0q/ta61VxSAdzdswh1j+WO9veefknSt8OH94NBiNM+ApiutddkE1MqcXGZztOsGRLGr9nFhPi68nk667i/j6taBbso3d4DYaqx3N5VOJpgIQQ+Ht54O/lQcuw2iWqonLb2QRVTWvqRL6ZPekF5JZYsDmqbumGeEfwpYii/OMnebFFKOEBXud1AZ5JVCZC/Ex41sFKwf9N+y+peam8MOCFyy9pffB7rayBfwTc/1mDXvi0ITuaU8KSLUf5OOU4RWYbXZoH8q+7uzG0e7NGt26aoh+VeBoBIQSB3p4EenvWatqqVqfedk4rKqeiZWXh+5MTGZvxAi0yv2fN8QRyS8qpJk8R5ONZaQKF1nKKC/MjPsqftpH+NAvyuejNglaHlTd3vUl8cDxDWg+5vG/Aryvh88kQ0QHu/1Rbh06pNSklPx3IZvHmNNanZmEUgsFdopnQP45eLUMa3M2HivtTiacJEkIQ5OtJkK8nbSKq2MHRAd5aybNiFc8+9jgODBSUWc9pTeU4J0/kVkpch0+X8MuRXPJLz96l7WsyEh/pT3yEvzMZBdA20p8Wob4YDYLVB1dztPAocwbNwWi4jE/UW+dppapbDdDGdLyrn+KqnKu43Man29NZvCWNw6dLCPc38cigeEb3aUVUoIkZHQYAABl+SURBVLfe4SmNmEsTjxBiMPA6YAQWSClnn/e6F7AE6A3kACOklGnO17oB7wCBgANIlFKahRBrgRhn7D8B06SUducxjwDTARvwlZTyCSFEHPAbcGaVvq1SyrPrSygXMhhh4JOwcgL87zMM3e4hxE/rWouPrPnw3BILB7OKOZBVxIHMYg6dLmbzoRw+23miYh+Th4HW4Z5kh8wh0tSO0vz2HPAqolWYHyaPWnTfSQnr/wk/vQIdbtNuDPVUfyxr4/DpYpZsOcrK7ekUl9vo3iKY10Z0Z0jXGLw8VHea4nr/3965h2VVZgv8twQUFG+IqCCIqajpGF5yEEuDLpbTsWl0uoxTwDQ10908J89Je5oeZ5q0mmo6M6lNZWaNdrroWGqlIjbe8q4poSIh4AUQTAURBN7zx97gBwJy+zag6/c838P+3r32/tZ+efe3vvW+a6/lNsMjIh7A34GbgQxgq4gsM8Ykuog9AJw0xvQVkXuA2cDdIuIJfADcZ4zZLSJdgLKf0XcZY06L5f9/AvwSWCwiUcAdwBBjTKGIuH5FHjLGhKPUnqt/Dt3+AgkvwqA7waP2Q8WvXWtG9vZjZG+/Cu2nz50nOSuv/PXvzE8o4iSpByfx6G4rJYlnKyHUvx39AnwtTynA8pKu6truwhpDSTEsnwo7FsCw++Fnr9VJvyuR0lLDugPZvLcxlXUHsvHyEG4fEkhMZCjhwZ2aWr0rhoSEBF555RW++OKLBsnURFJSEnFxcezYsYMXXnihWT4n5M67dSSQbIxJARCRxViGwdXw3AE8b29/AvzNNii3AHuMMbsBjDE5ZQcYY0676N4aKFt9eBiYZYwptOWy3HBNl6SktKR+U0bNjVatIGo6LP4V7FkMQ3/d4FN28PZiWEhnhoV0Jq8oj5Wffc0ov1G8fu8jpGTnl3tIB7Py2H/8DF/tO16+ttRKINivLQP9W/PU6ZfofzKBzGsew/eW52mnRqdaTp87z8fbMli4KZXUnLMEtG/DUzeFce9Pgwlorx5iZcqyj7RqwRku/Pz8eOONN1i6dGlTq1It7rxjg4B0l/cZwE+rkzHGFIvIKaALEAYYEfkK6AosNsa8VHaQ3T4SWIllsLCPuV5EXgDOAf9ljNlq7+stIjuB08Czxph/N95lXiD9TDqTl09mbPBYooOjGRU4Cm/PFnxz9x8PgUOtsgk/uQs8WzfaqV1LWrdt7cngoI4MDqq4PlNYXMIPJ/I5mGl5SBnHjnP/4Wn0L9nLH87HsODbSPj2a4I6+dieke0hdfOlb9f2dGxbzwi5y4CDmWdYsCmVz3Yc4WxRCcN7dWbqLf25dVD32k1lXkGkpqZy2223ERUVxaZNm5gyZQpz586lsLCQPn36MH/+fHx9fVmxYgVTp07F39+fYcOGkZKSUq1XsmXLFqZMmUJBQQE+Pj7Mnz+f/v37V5B5/vnnOXToEEeOHCE9PZ1p06bx4IMPAhfq8ezdu5fhw4fzwQcfICLMnDmTzz//nIKCAiIjI5k3b95FwR8BAQEEBASwfPly93RYI+BOw1NVKEzl2KjqZDyB64BrgbPAGvvBpDUAxphxIuINfAhEA6vsYzoDEfZx/yciVwHHgBBjTI6IDAeWisggF8/JUkTkIeAhgJCQkPpcLyWlJYwOGs2atDUsTV6Kj6cPkYGRRIdEMyZoDJ28W9iUhghEPQsfToSdC+HaBxrltCfPnWTBvgXcFHJTjSWt23h6MKB7BwZ07wBnMuGD34DZT/Gd/+D+wPGMyswjOesMB7PyOJiZx+aUnAoP3ga0b3PBIHWzghr6BfjSxffyTBJaUmpY830mCzalsiE5h9aerZhwTSCxkaEXGfXmyOwts0nKbdxquAP8BvDfI//7knKXUz2eloA7DU8GEOzyvidwtBqZDHtdpyOQa7evM8acABCRFcAwYE3ZgXagwTKs6bpV9jGfGSsVwxYRKQX8jTHZQNn023YROYTlHVVITWCMeQt4C6zMBfW54NCOobx4/YucLz3P9sztxKfFE58Wz5q0NXiIB8O7DSc6JJqo4KjGrTPjTvreCMER8M0rED65URbwy0paPz708dodkJsCC++EvGz41Ud49r2RPkCfrr5A93KxklLDkZMF1pSdvY50MCuPT7ZnkF90IWVR57Ze9AtoXx7yXbaO1K1DmxYZOvzj2SL+b1s67286TMbJAnp09Obpcf2559rgy9bINjaXUz2eloA7Dc9WoJ+I9AaOAPcAv6okswyIATYBk4B4Y0zZFNs0EWkLFAFjgddExBdob4w5Zhuq8ViRbQBLsbyfBBEJw1r/OSEiXYFcY0yJ7QH1A1Lcd9ng1cqLiB4RRPSI4JmRz5CYm1huhGZtmcWsLbMY6DeQqJAoooOjCesc1ny/8EQgegYs+A/YPh8iqq7fXluO5x9ncdLi2pe0PrbbyrtWWgIxn0PP4dWKerQSQrq0JaRLW24ceOFZHmMMx06dKzdEyfZa0vI9xzhVcOELoX0bT/p2s0K/+9mh330DfAnqVPOzSE1F0vHTLNiYypKdRzh3vpSRvf2YMX4gN1/dDc9GeLDXaWrjmbiLy6keT0vAbYbHXrN5DPgKK5z6XWPMPhGZCWwzxiwD3gEWikgylqdzj33sSRF5Fct4GWCFMWa5iHQDltlh2B5APDDX/sh3gXdFZC+WsYqxjdgYYKaIFAMlwO+NMbnuuu7KiAiDugxiUJdBPD70cdJOp7E2fS3xafHM2TWHN3e9SZBvENEh0UQHRzM0YGjzC07oPcZ6/fsvVhRZ6/rXVpm7ey6llPJweC0M2A//hkX3WsXqfv0ZdA2r12eKCIGdfAjs5MOYsAsPLhljOJFXxMGsM5ZRsteS1u7P5uPtGeVyPl4e9AloV26IyrykEL+2jn/BF5eUsioxk/c2pvLtD7l4e7Xi5+FBxESGMrBHB0d1uRyJiIjg0UcfJTk5mb59+3L27FkyMjIq1OMJDQ1t1Ho8zzzzDPn5+SQkJDBr1iwOHDhQpWxV9XgmTZpUvwttYtwaDmSMWQGsqNT2nMv2Oaxw6KqO/QArpNq1LRNr/aYq+SLgotArY8ynwMWTq01ESIcQYgbFEDMohhMFJ1iXvo749Hg+SvqIhYkL6dymc/MMToh6Ft69Bbb8A66bUq9TlJW0vrv/3QT5BtUsnLgMPn0A/PpY2Qg6XkK+HogIXdu3oWv7NkT2qVh07mR+EcnZeeUG6WDWGTan5LDE9Vkkj1Zc1bVd+VRdWWBDaG2fRaoDuflFLNqSxoebD3P01DmCOvnwzG0DuPvaYDq1bbygjysd13o8hYWFAPzpT38iLCysvB6Pv78/I0eOrPE806ZNIyYmhldffZXo6Ohq5crq8aSlpZXX46nO8LjW4wkNDb2oHg9YazzHjx9nxIgRnD59mlatWvH666+TmJhIhw7N54eJZqeuAndkp74U+efz2XBkA/Hp8XyT/g1nzp9pfsEJH0yCI9vgyT3gXfdB/PS6p1mXsY4Vv1hRc3XRbfOt53R6Xgv3Loa2ftXLOsyZc+c5lJ3Pwcwz5c8jHczKI/3kWcpuJY9WQmiXtuUGqV83y0Pq09W3zvnO9h45xXsbU1m2+yhFxaWM7tuFmFGh3DiwGx7NcPqvrrSk7NRaj6cimp36MqCdVztuCb2FW0Jv4XzpebYd32atC6U3o+CE6Bnw1g3w7VwYO61Oh5aVtH7wJw9Wb3SMgW9etkpw9xsHv3zPqhPUjGjv7UV4cKeLHrosKCrhULaVpaHMQzqYlcfq77MosR9GEoHgzm3tKLsLXlLfAF98XSp1ni8p5cu9x1mwMZVth0/i4+XBL4f3JCYylLBu7R29XuUCWo+n8VCPpwqawuOpDmMMiTmJrElbw9r0tST/aNWCb7LghMWT4Ydv4MnddfJEHln9CLuzd7Ny4ko6tK7CWyottXKubXkLrrkXJvwv1DdTdTOisLiEwzlnKxijQ1l5pGTnVyhlEdjRm77d2hPUyZv4pCwyTxfSq0tb7ovoxS9HBNPRp+X3RVW0JI+nKrQeT/08HjU8VdCcDE9lDp8+zNq0tcSnx7MraxcG42xwQuY+mDMarp8KNz53aXlgR+YOYr6MYcqwKTzwkyqeBSougqW/h72fQuTjcNNMK3PCZUxxSSlpuWfLw77LctsdPnGWob06ExvZixvCApplNF1j0tINz5WMGp5GpjkbHldcgxM2Hd3E+dLzzgQnfBwHB76CKXugXQ1rNVgeW+yXsaSdSWPFL1bg41mpiFjhGauOTspauHkmjH6y8fVVmi1qeFouusZzheLv48/EsIlMDJtYIThhzeGLMyeM7TmWjm0a6en1G56BxKWw/jUY90KNouuPrGdH1g5m/HTGxUYn/4RVMfTYHvj5HAiv/JiXoiiXI2p4LhMqBCeUnGdbphuDE7qGwZC7Yevb1tRY++5VipWaUt7Y+QZBvkFM7Dex4s6Th+GDX8CpDLjnn9D/1vrroyhKi+Lynki/QvHy8GJU4ChmRMxg9aTVLP7ZYn4z+Dfknstl1pZZjPt0HHd9fhdzds9hf+5+6jXdOnYalBZbD5VWw9epX5OUm8Sj4Y9WLGmdmQjvjoP8bLj/X2p0FOUKQw3PZY6IMMh/EE8Me4Ildyzhizu/4D+H/yfent7M2TWHSZ9PYvxn43l568tsz9xOSWnJpU8K4HeVVSph+3vwY/pFu4tLi6suaZ22GebbhibuSwiJaPhFKkoLISEhgdtvv73BMjWRlJTEqFGjaNOmDa+88kq1crGxsfTu3Zvw8HDCw8PZtWtXvT+zruhU2xVGrw69iB0cS+zg2ArBCYuSFvF+4vt0btOZG4JvIDokmogeETUHJ4x5Gnb903r2ZsIbFXaVlbT+a9RfL0TZ7f8SPo6Bjj3hviXQqX5ZwBXFXVxp9XhefvnlJkm7o4bnCqZycML6I+uJT4tn9eHVLElego+nD6MDR1uZE3qOuTg4oWNPGB5nrfVcN8XygoDCkkLm7J7DkK5DiAqOsmR3fgjLHoce18Dkjy8ZDadceRz/858p/L5xyyK0GTiA7tOn1yij9Xicp+WadaVRaefVjnGh45g9Zjbr7l7HvJvnMaHPBPac2MP09dMZ+9FYfvvVb/nw+w85lnfswoHXT7Ue9FxXXqePxUmLyTybyZNDn7Ruig1/hX89YiUajflcjY7S7Ni/fz/3338/q1at4p133mH16tXs2LGDESNG8Oqrr3Lu3Dl+97vfsXLlStavX092dnaN5yurx7Nz505mzpzJ9GqM3549e1i+fDmbNm1i5syZHD1qVY7ZuXNneY61lJQUNmzYAMBjjz3G1q1b2bt3LwUFBeWGb+7cueX52urCjBkzGDJkCE899VR5bjonUI9HuQgvDy8iAyOJDIxk+k+nk5hTdVmH6JBookOi6Xftb5HNb8J1U8nrGMjb371NRI8IRnYbAV8/Cxv/Fwb9Au6c16hVTJXLi0t5Ju7kSqzH8+KLL9K9e3eKiop46KGHmD17dnmROXejhkepkVbSisH+gxnsP5gnhj1B6qnU8rIOb+56k7/v+js92wUS3aUL0Wums3lAlFXS+ppHLS9n9yIY+RDcOvuyz0agtFyuxHo8PXr0KP+suLi4GgMRGhv9JlDqRGjHUOIGx7Fw/ELi74rnD6P+QO9OfVjUvh2xhfuZu3suN/W8gcGr/2wZnahn4baX1OgoLYKIiAg2bNhAcrKVE/Hs2bMcOHCgQj0eoFHr8Zw7d46cnBwSEhIqlDqoTFX1eBrCsWPWlLkxhqVLlzJ48OAGna8uqMej1Bt/H38mhU1iUtgk8k8fYf0717PNL5DY1H2QsRNufx1GxDW1mopSay73ejzjx4/n7bffJjAwkMmTJ5OdnY0xhvDw8HqtEdUXzdVWBS0lV1uzY91LVkkDjzYw8W24ekJTa6Q0c1pSrjatx1MRzdWmNA8iHobcH2DoZAi9rqm1UZRGRevxNB7q8VSBejyK4gwtyeOpCq3Hox6PoiiKo8TFxREXp+uYdUVDjRRFaVJ01qXl0dD/mRoeRVGaDG9vb3JyctT4tCCMMeTk5ODtXf8ikzrVpihKk9GzZ08yMjIumYJGaV54e3uXZ1aoD2p4FEVpMry8vMrT0ChXDjrVpiiKojiKGh5FURTFUdTwKIqiKI6iD5BWgYhkA4ebWo8a8AdONLUSNaD6NQzVr2Gofg2jIfr1MsZ0vZSQGp4WiIhsq83TwU2F6tcwVL+Gofo1DCf006k2RVEUxVHU8CiKoiiOooanZVJ9zd3mgerXMFS/hqH6NQy366drPIqiKIqjqMejKIqiOIoanmaEiNwqIvtFJFlE/qeK/VNFJFFE9ojIGhHp5bKvRER22a9lTaRfrIhku+jxW5d9MSJy0H7FNJF+r7nodkBEfnTZ50T/vSsiWSKyt5r9IiJv2PrvEZFhLvuc6L9L6TfZ1muPiGwUkWtc9qWKyHd2/7mlmFUt9LtBRE65/B+fc9lX49hwSL+nXXTba485P3ufE/0XLCJrReR7EdknIk9WIePMGDTG6KsZvAAP4BBwFdAa2A1cXUkmCmhrbz8MfOSyL68Z6BcL/K2KY/2AFPtvZ3u7s9P6VZJ/HHjXqf6zP2MMMAzYW83+8cBKQIAI4Fun+q+W+kWWfS5wW5l+9vtUwL+J++8G4IuGjg136VdJ9j+AeIf7rwcwzN5uDxyo4h52ZAyqx9N8GAkkG2NSjDFFwGLgDlcBY8xaY8xZ++1moP7pYd2gXw2MA1YZY3KNMSeBVcCtTazfvcCiRtahRowx3wC5NYjcAbxvLDYDnUSkB8703yX1M8ZstD8fnB9/tem/6mjI2K01ddSvKcbfMWPMDnv7DPA9EFRJzJExqIan+RAEpLu8z+DiQeHKA1i/TMrwFpFtIrJZRH7ehPpNtF30T0QkuI7HOqEf9hRlbyDepdnd/VcbqrsGJ/qvrlQefwb4WkS2i8hDTaQTwCgR2S0iK0VkkN3WrPpPRNpifWl/6tLsaP+JSCgwFPi20i5HxqCWRWg+SBVtVYYcisivgRHAWJfmEGPMURG5CogXke+MMYcc1u9zYJExplBEfg8sAKJreawT+pVxD/CJMabEpc3d/VcbqrsGJ/qv1ohIFJbhuc6lebTdfwHAKhFJsj0AJ9mBlbIlT0TGA0uBfjSz/sOaZttgjHH1jhzrPxHxxTJ6U4wxpyvvruKQRh+D6vE0HzKAYJf3PYGjlYVE5CZgBjDBGFNY1m6MOWr/TQESsH7NOKqfMSbHRad/AMNre6wT+rlwD5WmORzov9pQ3TU40X+1QkSGAG8DdxhjcsraXfovC1iCNb3lKMaY08aYPHt7BeAlIv40o/6zqWn8ubX/RMQLy+h8aIz5rAoRZ8agOxez9FWnhT9PrAW73lxYAB1USWYo1iJpv0rtnYE29rY/cJBGXjytpX49XLbvBDbb237AD7aene1tP6f1s+X6Yy3kipP95/JZoVS/OP4zKi7sbnGq/2qpXwiQDERWam8HtHfZ3gjc2gT6dS/7v2J9cafZfVmrseFu/ez9HbHWgdo53X92X7wPvF6DjCNjUKfamgnGmGIReQz4CisK511jzD4RmQlsM8YsA14GfIGPRQQgzRgzARgIzBORUiwvdpYxJrEJ9HtCRCYAxVg3V6x9bK6I/BHYap9upqk4zeCUfmAt6i429t1k4/b+AxCRRViRV/4ikgH8AfCy9Z8LrMCKKkoGzgJx9j63918t9XsO6AK8aY+/YmMlk+wGLLHbPIF/GmO+bAL9JgEPi0gxUADcY/+fqxwbTaAfWD/IvjbG5Lsc6kj/AaOB+4DvRGSX3TYd6weFo2NQMxcoiqIojqJrPIqiKIqjqOFRFEVRHEUNj6IoiuIoangURVEUR1HDoyiKojiKGh5FURTFUdTwKEoLxi4F8EVDZRTFSdTwKIobseub6H2mKC7oDaEojYyIhNrFtt7ESlx5n4hsEpEdIvKxnaQRERkvIkkist4uvlWtVyIiI8UqvrbT/tu/CpnnRWShiMTbxboedNnta2cMTxKRD8V+TF5EnhORrXZhsrfK2hXFnajhURT30B8rL9bNWJmcbzLGDAO2AVNFxBuYB9xmjLkO6HqJ8yUBY4wxQ7FS1/y5GrkhWPm2RgHPiUig3T4UmAJcjVUQbbTd/jdjzLXGmMGAD3B7na9UUeqI5mpTFPdw2BizWURux/qy32A7E62BTcAAIMUY84MtvwioqQ5LR2CBiPTDSkfvVY3cv4wxBUCBiKzFSpb5I1ayxwwAO09XKLAeiBKRaUBbrESQ+7DKWyiK21DDoyjuoSwJpGBVbrzXdaeI1LXswh+BtcaYO+0iXgnVyFVOvlj2vtClrQTwtL2uN4ERxph0EXke8K6jXopSZ3SqTVHcy2ZgtIj0Bav6pIiEYU2dXWUbEYC7L3GejsARezu2Brk7RMRbRLpgZUreWoNsmZE5Ya87TbqEDorSKKjhURQ3YozJxjIUi0RkD5YhGmBPhz0CfCki64FM4FQNp3oJeFFENmCl9q+OLcBy+3P+aOwCY9Xo9iNWwb7vsKp11mSkFKXR0LIIitJEiIivsco0C/B34KAx5rUGnO95IM8Y80pj6ago7kA9HkVpOh60F/r3YU2lzWtifRTFEdTjUZRmhIjEAU9Wat5gjHm0KfRRFHeghkdRFEVxFJ1qUxRFURxFDY+iKIriKGp4FEVRFEdRw6MoiqI4ihoeRVEUxVH+H6CKO9IzxhQjAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# summarize results\n",
    "print(\"Best: %f using %s\" % (gsearch5_1.best_score_, gsearch5_1.best_params_))\n",
    "test_means = gsearch5_1.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = gsearch5_1.cv_results_[ 'std_test_score' ]\n",
    "train_means = gsearch5_1.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = gsearch5_1.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "pd.DataFrame(gsearch5_1.cv_results_).to_csv('my_preds_reg_alpha_reg_lambda_1.csv')\n",
    "\n",
    "# plot results\n",
    "test_scores = np.array(test_means).reshape(len(reg_alpha), len(reg_lambda))\n",
    "train_scores = np.array(train_means).reshape(len(reg_alpha), len(reg_lambda))\n",
    "\n",
    "#log_reg_alpha = [0,0,0,0]\n",
    "#for index in range(len(reg_alpha)):\n",
    "#   log_reg_alpha[index] = math.log10(reg_alpha[index])\n",
    "    \n",
    "for i, value in enumerate(reg_alpha):\n",
    "    pyplot.plot(reg_lambda, -test_scores[i], label= 'reg_alpha:'   + str(value))\n",
    "#for i, value in enumerate(min_child_weight):\n",
    "#    pyplot.plot(max_depth, train_scores[i], label= 'train_min_child_weight:'   + str(value))\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'reg_alpha' )                                                                                                      \n",
    "pyplot.ylabel( '-Log Loss' )\n",
    "pyplot.savefig( 'reg_alpha_vs_reg_lambda1.png' )"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.15"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
